package cykbt.core;

import java.util.ArrayList;
import java.util.List;

public class Symbol {
	protected char representation;
	protected List<Character> possibleChar;
	private List<Doublon> possibleDoublons;

	public Symbol(char representation) {
		this.representation = representation;
		this.possibleDoublons = new ArrayList<Doublon>();
		this.possibleChar = new ArrayList<Character>();
	}

	/**
	 * ajoute une dérivation vers un charactere simple d
	 * 
	 * @param c
	 */
	public void addChar(char c) {
		this.possibleChar.add(c);
	}

	/**
	 * ajoute une dérivation vers un doublon
	 * 
	 * @param d
	 */
	public void addDoublon(Doublon d) {
		this.possibleDoublons.add(d);
	}

	/**
	 * 
	 * @return la lsite des charactere vers lequel se dérive le symbole
	 */
	public List<Character> getPossibleChar() {
		return this.possibleChar;
	}

	/**
	 * 
	 * @return la liste des doublons vers lequel se dérive le symbole
	 */
	public List<Doublon> getPossibleDoublons() {
		return this.possibleDoublons;
	}

	/**
	 * 
	 * @param c
	 * @return si le symbole peux dériver vers le caractere en paramètre
	 */
	public boolean derivesTo(char c) {
		return this.possibleChar.contains(c);
	}

	/**
	 * 
	 * @param symbol1
	 *            le premier symbole
	 * @param symbol2
	 *            le deuxième symbole
	 * @return si le symbole peux dériver vers la concaténation des symboles en
	 *         params
	 */
	public boolean derivesTo(Symbol symbol1, Symbol symbol2) {
		return this.possibleDoublons.contains(new Doublon(symbol1, symbol2));
	}

	public boolean equals(Object object) {
		if (object == this)
			return true;
		if (object instanceof Symbol) {
			Symbol symbol = (Symbol) object;
			return (this.representation == symbol.representation);
		}

		return false;

	}

	public String toString() {
		return "" + this.representation;
	}
}